
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

public class MyClass<E> {

    public static void myMethod(Object item) {
//        if (item instanceof E) {  //Compiler error
//            
//        }
//        E item2 = new E();   //Compiler error
//        E[] iArray = new E[10]; //Compiler error
//        E obj = (E)new Object(); //Unchecked cast warning
    }

    public static void main(String[] args) {

        List l = new ArrayList<Number>();
        List<String> ls = l;       // unchecked warning
        l.add(0, new Integer(42)); // another unchecked warning
        String s = ls.get(0);      // ClassCastException is thrown
//        
//        Lion king = new Lion() {};
//        Cage<Lion> lionCage = new Cage<>() {
//
//            @Override
//            public int size() {
//                throw new UnsupportedOperationException("Not supported yet.");
//            }
//
//            @Override
//            public boolean isEmpty() {
//                throw new UnsupportedOperationException("Not supported yet.");
//            }
//
//            @Override
//            public boolean contains(Object o) {
//                throw new UnsupportedOperationException("Not supported yet.");
//            }
//
//            @Override
//            public Iterator<Lion> iterator() {
//                throw new UnsupportedOperationException("Not supported yet.");
//            }
//
//            @Override
//            public Object[] toArray() {
//                throw new UnsupportedOperationException("Not supported yet.");
//            }
//
//            @Override
//            public <T> T[] toArray(T[] a) {
//                throw new UnsupportedOperationException("Not supported yet.");
//            }
//
//            @Override
//            public boolean add(Lion e) {
//                throw new UnsupportedOperationException("Not supported yet.");
//            }
//
//            @Override
//            public boolean remove(Object o) {
//                throw new UnsupportedOperationException("Not supported yet.");
//            }
//
//            @Override
//            public boolean containsAll(Collection<?> c) {
//                throw new UnsupportedOperationException("Not supported yet.");
//            }
//
//            @Override
//            public boolean addAll(Collection<? extends Lion> c) {
//                throw new UnsupportedOperationException("Not supported yet.");
//            }
//
//            @Override
//            public boolean removeAll(Collection<?> c) {
//                throw new UnsupportedOperationException("Not supported yet.");
//            }
//
//            @Override
//            public boolean retainAll(Collection<?> c) {
//                throw new UnsupportedOperationException("Not supported yet.");
//            }
//
//            @Override
//            public void clear() {
//                throw new UnsupportedOperationException("Not supported yet.");
//            }
//        };
//        lionCage.add(king);
//        
//        Butterfly monarch = new Butterfly() {};        
//        Cage<Butterfly> butterflyCage = new Cage<>() {
//
//            @Override
//            public int size() {
//                throw new UnsupportedOperationException("Not supported yet.");
//            }
//
//            @Override
//            public boolean isEmpty() {
//                throw new UnsupportedOperationException("Not supported yet.");
//            }
//
//            @Override
//            public boolean contains(Object o) {
//                throw new UnsupportedOperationException("Not supported yet.");
//            }
//
//            @Override
//            public Iterator<Butterfly> iterator() {
//                throw new UnsupportedOperationException("Not supported yet.");
//            }
//
//            @Override
//            public Object[] toArray() {
//                throw new UnsupportedOperationException("Not supported yet.");
//            }
//
//            @Override
//            public <T> T[] toArray(T[] a) {
//                throw new UnsupportedOperationException("Not supported yet.");
//            }
//
//            @Override
//            public boolean add(Butterfly e) {
//                throw new UnsupportedOperationException("Not supported yet.");
//            }
//
//            @Override
//            public boolean remove(Object o) {
//                throw new UnsupportedOperationException("Not supported yet.");
//            }
//
//            @Override
//            public boolean containsAll(Collection<?> c) {
//                throw new UnsupportedOperationException("Not supported yet.");
//            }
//
//            @Override
//            public boolean addAll(Collection<? extends Butterfly> c) {
//                throw new UnsupportedOperationException("Not supported yet.");
//            }
//
//            @Override
//            public boolean removeAll(Collection<?> c) {
//                throw new UnsupportedOperationException("Not supported yet.");
//            }
//
//            @Override
//            public boolean retainAll(Collection<?> c) {
//                throw new UnsupportedOperationException("Not supported yet.");
//            }
//
//            @Override
//            public void clear() {
//                throw new UnsupportedOperationException("Not supported yet.");
//            }
//        };
//        butterflyCage.add(monarch);
//        
//        Cage<? extends Animal> animalCage = new Cage<>() {
//
//            @Override
//            public int size() {
//                throw new UnsupportedOperationException("Not supported yet.");
//            }
//
//            @Override
//            public boolean isEmpty() {
//                throw new UnsupportedOperationException("Not supported yet.");
//            }
//
//            @Override
//            public boolean contains(Object o) {
//                throw new UnsupportedOperationException("Not supported yet.");
//            }
//
//            @Override
//            public Iterator<Animal> iterator() {
//                throw new UnsupportedOperationException("Not supported yet.");
//            }
//
//            @Override
//            public Object[] toArray() {
//                throw new UnsupportedOperationException("Not supported yet.");
//            }
//
//            @Override
//            public <T> T[] toArray(T[] a) {
//                throw new UnsupportedOperationException("Not supported yet.");
//            }
//
//            @Override
//            public boolean add(Animal e) {
//                throw new UnsupportedOperationException("Not supported yet.");
//            }
//
//            @Override
//            public boolean remove(Object o) {
//                throw new UnsupportedOperationException("Not supported yet.");
//            }
//
//            @Override
//            public boolean containsAll(Collection<?> c) {
//                throw new UnsupportedOperationException("Not supported yet.");
//            }
//
//            @Override
//            public boolean addAll(Collection<? extends Animal> c) {
//                throw new UnsupportedOperationException("Not supported yet.");
//            }
//
//            @Override
//            public boolean removeAll(Collection<?> c) {
//                throw new UnsupportedOperationException("Not supported yet.");
//            }
//
//            @Override
//            public boolean retainAll(Collection<?> c) {
//                throw new UnsupportedOperationException("Not supported yet.");
//            }
//
//            @Override
//            public void clear() {
//                throw new UnsupportedOperationException("Not supported yet.");
//            }
//        };
//        animalCage.add(king);
//        animalCage.add(monarch);
//        
//        animalCage = lionCage;
//        animalCage = butterflyCage;        
    }
}